package com.sams.service.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.util.StringUtil;
import com.sams.entity.CountrySub;
import com.sams.entity.CountrySubExample;
import com.sams.entity.DepartList;
import com.sams.entity.DepartListExample;
import com.sams.entity.GovSub;
import com.sams.entity.GovSubExample;
import com.sams.entity.NegativeStudent;
import com.sams.entity.NegativeStudentExample;
import com.sams.entity.School;
import com.sams.entity.SchoolSub;
import com.sams.entity.SchoolSubExample;
import com.sams.entity.Student;
import com.sams.entity.StudentExample;
 import com.sams.entity.SocietySub;
import com.sams.entity.GovSubExample;
import com.sams.entity.GovSubExample.Criteria;
import com.sams.entity.User;
import com.sams.mapper.DepartListMapper;
import com.sams.mapper.GovSubMapper;
import com.sams.mapper.NegativeStudentMapper;
import com.sams.mapper.SchoolMapper;
import com.sams.mapper.SchoolSubMapper;
import com.sams.mapper.SocietySubMapper;
import com.sams.mapper.StudentMapper;
import com.sams.service.GovSubService;
import com.sams.service.SchoolService;
import com.sams.service.SchoolSubService;
import com.sams.service.SocietySubService;

@Service
public class GovSubServiceImpl implements GovSubService {

	@Autowired
	private GovSubMapper mapper;
	@Autowired
	private SchoolMapper schoolMapper;
	@Autowired
	private SchoolService schoolService;
	@Autowired
	private NegativeStudentMapper negativeMapper;
	@Autowired
	private StudentMapper studentMapper;
	@Autowired
	private DepartListMapper  departListMapper;
	
	public PageInfo<GovSub> listStu(Integer currentPage, String name, String idcard, Integer schid, String subname,
			User user,Integer zid) {

		GovSubExample example = new GovSubExample();
		 Criteria createCriteria = example.createCriteria();
		 //本地用户
		 if(user.getRoleid()==1) {
			 createCriteria.andUidEqualTo(user.getId());
		 }else if(user.getRoleid()==2) {//镇级别账号 
			 
			 List<Integer> scIds = new ArrayList<Integer>();
			 List<School> scList = schoolMapper.selectSchoolByUid(user.getId());
			for(School sc : scList) {
				scIds.add(sc.getSchid());
			}
			 createCriteria.andSchidIn(scIds);
			//镇账户查询状态：镇审核中2，县审核重点3   status>=2 
			createCriteria.andStatusGreaterThanOrEqualTo(2);
		}else {//， 4 说明是管理员
			//， 3：县账号，4 ：管理员
			 if(user.getRoleid()==3) {// 3//镇账户查询状态： 县审核重点3
				createCriteria.andStatusEqualTo(3);
			}
			 //根据镇id 也是查询所有学校
			 if(zid!=null &&  !zid.equals("")) {
				 List<Integer> scIds = new ArrayList<Integer>();
				 List<School> scList = schoolMapper.selectSchoolByZid(zid);
				 for(School sc : scList) {
					 scIds.add(sc.getSchid());
				 }
				 createCriteria.andSchidIn(scIds);
			 }
		}
		 
		 //按条件查询
		 if(name!=null && !name.equals("")) {
			 createCriteria.andNameEqualTo(name.trim());
		 }
		 if(idcard!=null && !idcard.equals("")) {
			 createCriteria.andIdcardEqualTo(idcard.trim());
		 }
		 if(schid!=null && !"".equals(schid.toString())) {
			 createCriteria.andSchidEqualTo(schid);
		 }
		 if(subname!=null && !"".equals(subname)) {
			 createCriteria.andSubnameEqualTo(subname);
		 } 
		// 查询不等于4的
	     createCriteria.andStatusNotEqualTo(4);
		// 1 定义当前页  和 一页显示的行数 
		  PageHelper.startPage(currentPage, 20);  
		 // 2  调用查询语句
		List<GovSub> list =   mapper.selectByExample(example);
		
		PageInfo<GovSub> pageInfo = new PageInfo<GovSub>(list);
		
		return pageInfo;
	}

	public GovSub findById(Integer id) {
		// TODO Auto-generated method stub
		return null;
	}

	public void delete(Integer id) {
		 mapper.deleteByPrimaryKey(id);
		
	}

	public int add(GovSub sub) throws Exception {
		//存在学生
		if(isExistStudent(sub.getIdcard(),sub.getSchid(),sub.getSubname(),null)) {
			throw new Exception(sub.getName()+"在当前学期中已存在，不能再次添加");
		}
		return mapper.insert(sub);
	}

	public void update(GovSub sub) throws Exception {
		//存在学生
		if(isExistStudent(sub.getIdcard(),sub.getSchid(),sub.getSubname(),sub.getId())) {
			throw new Exception(sub.getName()+"在当前学期中已存在，不能再次添加");
		}
		 mapper.updateByPrimaryKey(sub);
		
	}
	/**
	 * 导入学校资助 学生
	 * @throws Exception 
	 */
	public boolean insertBatch(List<GovSub> stuList) throws Exception {
		//缓存当前excel中的数据，并是否存在重复记录。
		Map<String,String>  allStudent = new HashMap<String,String>();
		StringBuffer sb = new StringBuffer();
		 for(GovSub stu : stuList) {
			 	//1、 验证学校
				School ss =  schoolService.getSchoolByName(stu.getSchoolname(),stu.getXueduan());//学段 + 学校姓名 找唯一的id
				if(ss!=null) {
					 stu.setSchid(ss.getSchid());
				}else {
					sb.append(stu.getName()+"没有对应的学校<br/>");
				//	 throw new Exception(stu.getName()+"没有对应的学校");
				}
				// 2、验证学生的来源 
				String msg = this.selectIdCard(stu.getIdcard(),stu.getSubname(),stu.getSchid(),null);
			    if("negativeErr".equals(msg)) {
					sb.append(stu.getName()+"该学生存在于负面清单学生列表，不能被资助<br/>");
					//throw new Exception(stu.getName()+"该学生存在于负面清单学生列表，不能被资助");
				}else if("notIn".equals(msg)) {
					sb.append(stu.getName()+",在校学生或部门比对清单中不存在该学生"+stu.getName()+"，不能被资助<br/>");
					// throw new Exception("在校学生或部门比对清单中不存在该学生"+stu.getName()+"，不能被资助");
				}
				//验证同一批次
				if(isExistStudent(stu.getIdcard(),stu.getSchid(),stu.getSubname(),null)) {
					sb.append(stu.getName()+",在当前学期中已存在，不能再次添加");
				}
				//还需要验证 当前导入中，是否存在重复数据（身份证编号+项目名）
			    if(allStudent.containsKey(stu.getIdcard())) {
			    	if(allStudent.get(stu.getIdcard()).equals(stu.getSubname())) {
			    		sb.append(stu.getName()+",同一个身份证号不能在同一个项目资助多次<br/>");
			    	}
			    }
				//每验证一个学生，需要加入缓存，以供下次验证是否重复
				allStudent.put(stu.getIdcard(), stu.getSubname());
				
			
		 }
		 	if(!StringUtil.isEmpty(sb.toString())) {
		 		throw new Exception(sb.toString());
		 	}
		 
		   //验证没问题 再批量添加，
		 	for(GovSub stu : stuList) {
		 		 mapper.insert(stu);
		 	}
			//若没有异常，则导出成功 
			return true;
	}
	
	/**
	 * 先验证负面清单在不在 如果在就直接return 后验证是否在在校学生和部门对比学生
	 */
	public String selectIdCard(String idcard, String project,Integer schid,Integer id){
		
		if (project != null) {
			GovSubExample example = new GovSubExample();
			Criteria criteria = example.createCriteria();
			criteria.andSubnameEqualTo(project);
			criteria.andIdcardEqualTo(idcard);
			criteria.andSchidEqualTo(schid);
			if(id!=null) {
				criteria.andIdNotEqualTo(id); //修改查询验证时，排除它自己
			}
			List<GovSub> list = mapper.selectByExample(example);
			//System.out.println("listCountrySub:"+listCountrySub);
			if (list != null && !list.isEmpty()) {
				// 存在 不能添加
				return "countrySubErr";
			}
		}
		
		// 验证负面清单
		NegativeStudentExample negativeStudentExample = new NegativeStudentExample();
		com.sams.entity.NegativeStudentExample.Criteria negativeCreateCriteria = negativeStudentExample
				.createCriteria();
		// 设置查询条件
		negativeCreateCriteria.andIdcardEqualTo(idcard);
		List<NegativeStudent> listNegativeStudent = negativeMapper.selectByExample(negativeStudentExample);
		if (listNegativeStudent != null && !listNegativeStudent.isEmpty()) {
			// 存在 不能添加
			// System.out.println("在负面清单,不能添加!");
			return "negativeErr";
		} else {
			// 不存在 (继续验证在校学生和部门对比) 如果在就可以添加
			// System.out.println("不在负面清单!");
			// 验证在校学生是否存在
			StudentExample studentExample = new StudentExample();
			com.sams.entity.StudentExample.Criteria studentCreateCriteria = studentExample.createCriteria();
			// 设置查询条件
			studentCreateCriteria.andIdcardEqualTo(idcard);
			List<Student> listStudent = studentMapper.selectByExample(studentExample);
			// 判断是否存在
			if (listStudent != null && !listStudent.isEmpty()) {
				// 存在 可以添加
				// System.out.println("在校学生存在,可以添加!");
				return "studentYes";
			} else {
				// 验证部门对比是否存在
				DepartListExample departListExample = new DepartListExample();
				com.sams.entity.DepartListExample.Criteria departListCreateCriteria = departListExample
						.createCriteria();
				departListCreateCriteria.andIdcardEqualTo(idcard);
				List<DepartList> listDepartList = departListMapper.selectByExample(departListExample);
				if (listDepartList != null && !listDepartList.isEmpty()) {
					// 存在 可以添加
					// System.out.println("部门对比存在,可以添加!");
					return "departListYes";
				} else {
					// 都不存在 不能添加
					return "notIn";
				}
			}
		}
	}

	/**
	 * 根据身份证、学期id，项目，验证唯一性 
	 * @return
	 */
	public boolean isExistStudent(String idcard,Integer schid,String project,Integer id) {
		GovSubExample example = new GovSubExample();
		Criteria createCriteria = example.createCriteria();
		 createCriteria.andSchidEqualTo(schid);
		 createCriteria.andIdcardEqualTo(idcard);
		 createCriteria.andSubnameEqualTo(project);
		 //用于修改时验证，并排除它自己
		 if(id!=null) {
			 createCriteria.andIdNotEqualTo(id);
		 }
		 List<GovSub> list =mapper.selectByExample(example);
		 if(list!=null && list.size()>0) {
			 return true;  //存在
		 }else {
			 return false;//不存在
		 }
	}

	public void deleteBatch(String ids) {
		String [] array =ids.split(",");
		 mapper.deleteBatch(Arrays.asList(array));
	}

}
